package projeto.controller;

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import projeto.model.*;
/**
 * Classe que compara algoritmos de recomendação
 * @author jeymissonebeo
 *
 */
public class ComparaRecomendacao {
	/**
	 * Método que analisa o percentual de acerto do algoritmo de recomendação
	 * @param ests Lista de Estabelecimentos utilizados nas recomendações
	 * @param users Lista de Usuários utilizados nas recomendações
	 * @param qtdRecs Quantidade de recomendações para analise
	 * @param algoritmo Algoritmo de recomendação para analise
	 * @return Percentual de acerto do algoritmo
	 */
	public static double acertosRecomendacao(List<Estabelecimento> ests, List<Usuario> users, int qtdRecs, Recomenda algoritmo){
		
		int acerto = 0;
		int iteracao = 0;
		int opiniaoInstantanea;
		Iterator<Usuario> userIt = users.iterator();
		List<Integer> opinioes;
		Usuario user;
		Iterator<Estabelecimento> recomendacoesIt;
		List<String> restaurantes = LeituraDeDados.opniaoRestaurantes;
		
		while(userIt.hasNext()){
			user = userIt.next();
			opinioes = user.getOpnioes();
			for(int i = 0; i< opinioes.size(); i++){
				opiniaoInstantanea = opinioes.get(i);
				if(opiniaoInstantanea > 0){
					opinioes.set(i,0);
					recomendacoesIt = algoritmo.getRecomendacao(ests, users, user, qtdRecs).iterator();
					while(recomendacoesIt.hasNext()){
						if(restaurantes.get(i).equals(recomendacoesIt.next().getNome())){
							acerto++;
							break;
						}
					}
					iteracao++;
					opinioes.set(i,opiniaoInstantanea);
				}
			}
		}
		return Math.round(((acerto *100.0) / iteracao) * 100) / 100d;
	}
	
    public static void main(String[] args) {
        
        List<Estabelecimento> ests = LeituraDeDados.lerEstabelecimentos("lista_estabelecimentos_projeto_lp2-v2.data"); 
        List<Usuario> users = LeituraDeDados.lerUsuarios("opinioes-dos-usuarios-v2.data");
        LeituraDeDados.verificaTabelas(ests);
        
        Recomenda popularidade = RecomendaPopularidade.getInstance();
        Recomenda escalar  = RecomendaEscalar.getInstance();
        Recomenda cosseno = RecomendaCosseno.getInstance();
        
        
        List<Recomenda> recs = new LinkedList<Recomenda>();
        
        recs.add(popularidade);
        recs.add(escalar);
        recs.add(cosseno);
        
        for(Recomenda r : recs){
                System.out.println(acertosRecomendacao(ests, users, 39, r));
        }
    }    
}
